[今さら]Amazon Forecastで2022年末、2023年始の新型コロナウイルスの都道府県別・日別感染者数を予測する[今だからこそ]
データアナリティクス事業本部 インテグレーション部 機械学習チームの貞松です。
本記事は「クラスメソッド 機械学習チーム アドベントカレンダー 2022」の4日目です。
昨日(3日目)は じょんすみす による Vertex AIのカスタムコンテナでバッチ推論をする でした。
2022年も年の瀬が迫る本日、Amazon Forecast(以下Forecast)を用いて、2022年末、2023年始の新型コロナウイルス感染者数を時系列で予測します!
…今さら?と思われる方もいらっしゃるかもしれませんね。
パンデミック発生当初から世界中でCOVID-19データの分析、可視化が盛んに行われており、擦り倒されたネタであると言えます。
また、既に数回のワクチン接種が実施されており、感染者数の全数把握も見直されている現状で、この予測の有用性に疑問を持たれるのも当然かも知れません。
本記事では、なぜ今さら新型コロナウイルスの感染者数予測をForecastで実施するのかについて触れつつ、実施した予測について実行手順ベースで解説します。
なぜ今さら新型コロナウイルスの感染者数予測を実施しようと思ったのか
なぜ今さら擦り倒されたネタを触ろうと思ったのか、理由は主に以下の2点です。
長期のデータが蓄積されている
コロナ禍に突入して約3年が経過しており、日別の感染者数データが長期の時系列データとして蓄積されている為、現時点でより精度の高い予測が出来るのではないかと思い至りました。
ワクチン接種に関するデータが付加情報として利用できる
冒頭で「既に数回のワクチン接種が実施されており」と述べましたが、ワクチン接種に関するデータについても、感染者数データと同様にオープンデータ(デジタル庁)が存在しており、これをForecastで使用するメタデータに含めることにより、一時期に比べて感染者数のピーク値が落ち着いている現状を考慮した予測が作成できるのではないかと期待した次第です。
必要なデータ準備
オープンデータの取得
日別・都道府県別の感染者数データ
感染者数のデータは厚生労働省ホームページから取得します。
実際にダウンロードしたのは「新規陽性者数の推移(日別)」です。
項目 | 内容 |
---|---|
ファイル名 | newly_confirmed_cases_daily.csv |
データの粒度 | 日別・都道府県別 |
データ期間 | 2020-01-16〜データ取得前日分まで |
データ件数 | 1051件 (2022-12-02現在) |
ワクチン接種に関するデータ
ワクチン接種に関するデータはワクチン接種記録システム(VRS)のページから取得します。
実際にダウンロードしたのは「接種日別接種回数サマリー(CSV)」と「都道府県別累積接種回数サマリー(CSV)」です。
接種日別接種回数サマリー(CSV)
項目 | 内容 |
---|---|
ファイル名 | summary_by_date.csv |
データの粒度 | 日別(全国の合計) |
データ期間 | 2021-04-16〜データ取得前日分まで |
データ件数 | 599件 (2022-12-02現在) |
都道府県別累積接種回数サマリー(CSV)
項目 | 内容 |
---|---|
ファイル名 | summary_by_prefecture.csv |
データの粒度 | 都道府県別累計 |
データ期間 | データ取得前日分のみ (累計) |
データ件数 | 47件 |
ワクチン接種に関するオープンデータの仕様は下記ページを参照してください。
ワクチン接種に関するデータについては、後述の前処理により、ForecastのRelated Time SeriesデータセットとItem Metadataデータセットとして利用することにより、予測精度の向上を図ります。
データ前処理とS3への配置
取得したデータをそのままForecastにインポートできる形式に変換して任意のS3バケット(プレフィックス)に配置するPythonコードを準備しました。
使用ライブラリとしては、PandasとBoto3(AWS SDK for Python)のみです。
Forecastのデータセット仕様については下記ページを参照してください。
最終的に生成されるデータの定義は以下の通りです。
新規陽性者数の推移(日別) → Target Time Seriesデータセット
カラム名 | データ型 |
---|---|
item_id | string |
timestamp | timestamp |
target_value | integer |
接種日別接種回数サマリー → Related Time Seriesデータセット
※本当は日別・都道府県別のデータがあるとベストでしたが、日別の全国合計のデータしか存在しなかった為、各item_idの内容は同じとなっています。
カラム名 | データ型 |
---|---|
item_id | string |
timestamp | timestamp |
count_first_shot_general | float |
count_second_shot_general | float |
count_third_shot_general | float |
count_fifth_shot_general | float |
count_fifth_shot_general | float |
都道府県別累積接種回数サマリー → Item Metadataデータセット
カラム名 | データ型 |
---|---|
item_id | integer |
count_first_shot_pref | integer |
count_second_shot_pref | integer |
count_third_shot_pref | integer |
count_fifth_shot_pref | integer |
count_fifth_shot_pref | integer |
Forecastによる予測の実行
データの準備ができたので、Forecastにデータをインポートして予測を実行します。
具体的に実行する操作は以下の通りです。
- データセットグループの作成
- データセットの作成
- データセットインポート
- 予測子の作成(予測モデルの学習)
- 予測を作成
- 予測をエクスポート
各操作は全てBoto3(AWS SDK for Python)経由で実行します。
途中でデータセットインポートジョブや予測子の作成(予測モデルの学習)ジョブの完了待ちが発生する都合上、Jupyter Notebook形式で実装しております。
同様の仕組みを本番運用する際は、EventBridgeやStepFuctionsを利用した実行制御を導入することをオススメします。
マネジメントコンソール上で一連の操作を実行したい場合は、下記の記事をご参照ください。
予測の可視化
エクスポートされた予測結果と学習データとして使用した実績データを合わせて、Excel上でグラフ化してみました。
実績データは、2022-01-01〜2022-12-01までを表示、2022-12-02〜2023-01-31の期間で表示されているのが予測値(P10、P50、P90)です。
ここでは例として最大規模である東京と、私の居住地域である岡山の結果を示します。
東京の予測結果
東京の予測結果は下図の通りです。
P50の結果であれば、年末年始は今年(2022年)のお盆時期よりは緩やかな山になるようです。
P90の結果のように上振れしてしまうと、お盆時期と同程度のスパイクになりそうです。
P10の結果のように下振れした場合は、昨年の年末年始と同程度に収まりそうです。
岡山の予測結果は下図の通りです。
P50の結果であれば、東京と同様に年末年始は今年(2022年)のお盆時期よりは緩やかな山になるようです。
P90の結果のように上振れしてしまうと、お盆時期よりも高いスパイクになるという予測になっており、注意が必要な状況に見えます。
P10の結果のように下振れした場合でも、昨年の年末年始よりも高い山になっており、意外にも安心できる数値ではなさそうです。
ここではグラフの見易さの都合で、2022/1/1〜のデータを可視化していますが、更に過去のデータから傾向を確認したい場合は、実際に本記事の処理を実行してみる、あるいは下記NHKの新型コロナウイルス特設サイトにある都道府県別の感染者数データをご参照ください(日別の感染者数グラフと併せて移動平均の数値も表示されており、非常に傾向が掴みやすくなっています)
まとめ
長期で蓄積された新型コロナウイルスの感染者数の時系列データと新たに得られるようになったワクチン接種に関するデータを利用することにより、「今だからこそ」できる時系列予測をForecastで作成してみました。
作成された予測から見ても、年末年始の感染者数増大は避けられそうにはないものの、大きく上振れしなければ今年(2022年)のお盆時期にあった大きなスパイクに比べると比較的緩やかになる見込みとなっています。
個人的には、適度な気遣いをしながらも「普段どおりに」年末年始を過ごしていただければ良いのかな、という所感です。